home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 008 / bonus.arc / MOON.LSP < prev    next >
Encoding:
Lisp/Scheme  |  1985-11-10  |  5.2 KB  |  150 lines

  1.  
  2. ;       Draw the Moon
  3.  
  4. ;       By Kelvin R. Throop  --  November 10, 1985
  5.  
  6. ;       MOON  --  Draw the moon at the current time
  7.  
  8. (defun c:moon ()
  9.         (setq cdate (getvar "date"))
  10.         (princ "\nCalculating.  Please stand by...")
  11.         (setq ph (phase cdate))
  12.         (setq aom (* ph (- ptime lptime)))
  13.         (princ "  Age of moon is ")
  14.         (princ (rtos (float (fix aom)) 2 0))
  15.         (princ " days ")
  16.         (princ (rtos (* 24 (- aom (fix aom))) 2 0))
  17.         (princ " hours.")
  18.         ; Form unique block name, BNAME, from time of execution
  19.         (setq bname (rtos (* 100000.0 (- cdate (fix cdate))) 2 0))
  20.         (if (or (= ph 0.0) (= ph 1.0))
  21.            (progn
  22.               (princ "\nMoon is new!\n")        ; New moon -- nothing to draw
  23.               nil
  24.            )
  25.            (progn
  26.               (setq cp (getpoint "\nCentre point: "))
  27.               (setq size (getdist "\nSize: " cp))
  28.               (setq cech (getvar "cmdecho"))
  29.               (setq blpm (getvar "blipmode"))
  30.               (setvar "cmdecho" 0)
  31.               (setvar "blipmode" 0)
  32.               (command "arc" "c" cp)
  33.               (setq p1 (polar cp (* pi 0.5) size))
  34.               (setq p2 (polar cp (* pi 1.5) size))
  35.               (if (< ph 0.5)
  36.                  (command p2 p1)
  37.                  (command p1 p2)
  38.               )
  39.               (command "block" bname cp "l" "")
  40.               (command "insert" bname cp 1 1 0)
  41.               (setq xscale (cos (* 2.0 pi ph)))
  42.               (if (< (abs xscale) 0.0000001)
  43.                  (command "line" p1 p2 "")      ; Half moon -- draw line
  44.                  (command "insert" bname cp xscale 1 0)
  45.               )
  46.               (setvar "cmdecho" cech)
  47.               (setvar "blipmode" blpm)
  48.            )
  49.         )
  50. )
  51.  
  52. ;       PHASE  --  Return phase of the moon as a real value:
  53.  
  54. ;             0.00 = New
  55. ;             0.25 = First quarter
  56. ;             0.50 = Full
  57. ;             0.75 = Last quarter
  58.  
  59. ;       The argument is the time for which the phase is requested,
  60. ;       expressed as a Julian date and fraction.  Results are accurate
  61. ;       to about 2 minutes.
  62.  
  63. (defun phase (pdate)
  64.         (setq y (car (jyear pdate)))
  65.         (setq tzone 8)
  66.         (setq r1 (/ pi 180))
  67.         (setq u 0)
  68.         (setq k0 (fix (* (- y 1900.0) 12.3685)))
  69.         (setq t (/ (- y 1899.5) 100.0))
  70.         (setq t3 (* (setq t2 (* t t)) t))
  71.         (setq j0 (+ 2415020.0 (* 29 k0)))
  72.         (setq f0 (- (* 0.0001178 t2) (* 1.55E-7 t3)))
  73.         (setq f0 (+ f0 0.75933 (* 0.53058868 k0)))
  74.         (setq f0 (- f0 (* 8.370001E-4 t) (* 0.000335 t2)))
  75.         (setq m0 (* k0 0.08084821133))
  76.         (setq m0 (+ (* 360.0 (- m0 (fix m0))) 359.2242))
  77.         (setq m0 (- m0 (* 0.0000333 t2)))
  78.         (setq m0 (- m0 (* 3.47E-6 t3)))
  79.         (setq m1 (* k0 0.07171366128))
  80.         (setq m1 (+ (* 360.0 (- m1 (fix m1))) 306.0253
  81.            (* 0.0107306 t2) (* 1.236E-5 t3)))
  82.         (setq b1 (* k0 0.08519585128))
  83.         (setq b1 (+ (* 360.0 (- b1 (fix b1))) 21.2964))
  84.         (setq b1 (- b1 (* 0.0016528 t2) (* 2.39E-6 t3)))
  85.         (setq k9 0.0)
  86.         (setq lptime 0.0)
  87.         (while (< k9 29)
  88.            (setq j (+ j0 (* 14.0 k9)))
  89.            (setq f (+ f0 (* 0.765294 k9)))
  90.            (setq k (/ k9 2.0))
  91.            (setq m5 (* (+ m0 (* k 29.10535608)) r1))
  92.            (setq m6 (* (+ m1 (* k 385.81691806)) r1))
  93.            (setq b6 (* (+ b1 (* k 390.67050646)) r1))
  94.            (setq f (+ f (* -0.4068 (sin m6))
  95.                         (* (- 0.1734 (* 0.000393 t)) (sin m5))
  96.                         (* 0.0161 (sin (* 2 m6)))
  97.                         (* 0.0104 (sin (* 2 b6)))
  98.                         (* -0.0074 (sin (- m5 m6)))
  99.                         (* -0.0051 (sin (+ m5 m6)))
  100.                         (* 0.0021 (sin (* 2 m5)))
  101.                         (* 0.001 (sin (- (* 2 b6) m6)))
  102.                    )
  103.            )
  104.            (setq j (+ j (fix f)))
  105.            (setq f (- f (fix f)))
  106.            (setq f (+ f (/ tzone 24.0)))
  107.            (if (>= f 1) (progn
  108.               (setq f (1- f))
  109.               (setq j (1+ j)))
  110.            )
  111.            (if (< f 0) (progn
  112.               (setq f (1+ f))
  113.               (setq j (1- j)))
  114.            )
  115.            (setq lptime ptime)
  116.            (setq ptime (+ j f))
  117.            (if (and (>= cdate lptime) (< cdate ptime))
  118.               (setq k9 1000)
  119.            )
  120.            (setq k9 (+ k9 2))
  121.         )
  122.         (setq ph (/ (- cdate lptime) (- ptime lptime)))
  123. )
  124.  
  125. ;       JYEAR  --  Convert Julian date to a list containing
  126. ;                  (year month day).
  127.  
  128. (defun jyear (td)
  129.         (setq j (fix td))
  130.         (setq j (- j 1721119.0))
  131.         (setq y (fix (/ (1- (* 4 j)) 146097.0)))
  132.         (setq j (- (* j 4.0) 1.0 (* 146097.0 y)))
  133.         (setq d (fix (/ j 4.0)))
  134.         (setq j (fix (/ (+ (* 4.0 d) 3.0) 1461.0)))
  135.         (setq d (- (+ (* 4.0 d) 3.0) (* 1461.0 j)))
  136.         (setq d (fix (/ (+ d 4.0) 4.0)))
  137.         (setq m (fix (/ (- (* 5.0 d) 3) 153.0)))
  138.         (setq d (- (* 5.0 d) 3.0 (* 153.0 m)))
  139.         (setq d (fix (/ (+ d 5.0) 5.0)))
  140.         (setq y (+ (* 100.0 y) j))
  141.         (if (< m 10.0)
  142.            (setq m (+ m 3))
  143.            (progn
  144.               (setq m (- m 9))
  145.               (setq y (1+ y))
  146.            )
  147.         )
  148.         (list y m d)
  149. )
  150.